//专门处理用户的业务逻辑
//1. express框架
const express = require('express');
const fs = require('fs');
const path = require('path');
//2.创建一个后台路由
const router = express.Router();
// 导入用户数据模块
const userModel = require('../../model/userModel')
// 导入生成id的包
const {
    v4: uuidv4
} = require('uuid');

//导入获取当前时间的包
const moment = require('moment')

// 手机号正则表达式
const rep_phone = /^1[3-9]\d{9}$/
// 邮箱正则表达式
const rep_email = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/
// 导入发送邮箱验证码工具函数
const emailApi = require('../../utils/emailApi');
// 导入jwt token工具
const JwtUtil = require('../../utils/jwt');
//导入上传文件的包
const multer = require('multer');


// 定制上传文件的信息（文件名、文件路径等）
const storage = multer.diskStorage({
    // 设置保存文件的路径
    destination: function (req, file, callback) {
        callback(null, 'public/upload/')
    },
    filename: function (req, file, callback) {
        // 将保存文件名设置为 字段名 + 时间戳，
        // 比如 logo-1478521468943
        let suffix = file.mimetype.split('/')[1];
        //获取文件格式
        callback(null, file.fieldname + '-' + Date.now() + '.' + suffix);
    }
})

// 生成的图片放入upload文件夹下
const upload = multer({
    storage: storage
});

// 获取服务器地址
let {
    HOST_URL
} = require('../../config/host');
const {
    log
} = require('console');



//二级路由
//req: request 请求对象 （前端提交的数据）
//res: response 响应对象 （操作后端响应数据）

// 接口1: 注册功能（不需要邮箱验证码）
router.post('/register', async (req, res) => {
    // 解构赋值
    let {
        user_acc,
        user_pwd,
        user_nick_name,
        // user_create_time
    } = req.body;
    // 判断账号是否为邮箱
    if (rep_email.test(user_acc)) {
        // 生成随机字符串
        let user_id = uuidv4() || Math.random().toString().slice(2);
        // 生成当前的时间
        let user_create_time = moment().format('YYYY-MM-DD HH:mm:ss');
        // 注册用户
        await userModel.register(user_id, user_acc, user_pwd, user_nick_name, user_create_time)
            .then(
                content => {
                    res.send(content);
                }
            )
            .catch(
                error => {
                    res.send(error);
                }
            )
    } else {
        // 数据格式不正确
        res.send({
            code: -1,
            msg: '该账号不是一个邮箱格式。'
        })
    }

})

// 接口2: 发送邮箱验证码
router.get('/send_code', async function (req, res) {
    let email = req.query.email;
    let rep = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;
    if (rep.test(email)) {
        emailApi.Email.getEmailCode(email)
            .then(
                () => {
                    res.send({
                        code: 200,
                        msg: "验证码发送成功。",
                    })
                }
            )

    } else {
        res.send({
            code: -1,
            msg: "邮箱格式不正确。"
        })
    }

})

// 接口3: 注册功能（需要邮箱验证码）
router.post('/register2', async (req, res) => {
    // 解构赋值
    let {
        user_acc,
        user_pwd,
        user_nick_name,
        user_create_time,
        email_code
    } = req.body;
    // 判断账号是否为邮箱
    if (rep_email.test(user_acc)) {
        // 生成随机字符串
        let user_id = uuidv4();
        console.log('name', user_nick_name);
        // 注册用户
        await userModel.register2(user_id, user_acc, user_pwd, user_nick_name, user_create_time, email_code)
            .then(
                content => {
                    res.send(content);
                }
            )
            .catch(
                error => {
                    res.send(error);
                }
            )
    } else {
        // 数据格式不正确
        res.send({
            code: -1,
            msg: '该账号不是一个邮箱格式。'
        })
    }
})

// 接口4: 登录功能（需要邮箱验证码）
// 参数：user_acc , user_pwd
router.post('/login2', async (req, res) => {
    let {
        user_acc,
        user_pwd,
        email_code
    } = req.body;
    if (user_acc == undefined || user_pwd == undefined) {
        res.send({
            code: -1,
            msg: '缺少参数，检查提交的方式是否正确?'
        })
        return;
    }

    if (user_acc == false || user_pwd == false) {
        res.send({
            code: -1,
            msg: '缺少参数，检查提交的方式是否正确?'
        })
        return;
    }
    // 如果用户把手机号码和账号进行绑定了，用户就可以使用手机号码进行登录（本身使用邮箱登录）
    if (rep_phone.test(user_acc) || rep_email.test(user_acc)) {
        // 调用登录方法
        await userModel.login(user_acc, user_pwd, email_code)
            .then(
                data => {
                    res.send(data)
                }
            )
            .catch(
                err => {
                    res.send({
                        code: 500,
                        msg: '服务器异常...',
                        err: err,
                    })
                }
            )
    } else {
        res.send({
            code: -1,
            msg: '账号格式不正确?'
        })
    }

})

// 接口5：登录功能
// 参数：user_acc , user_pwd
router.post('/login', async (req, res) => {
    let {
        user_acc,
        user_pwd
    } = req.body;
    if (user_acc == undefined || user_pwd == undefined) {
        res.send({
            code: -1,
            msg: '缺少参数，检查提交的方式是否正确?'
        })
        return;
    }

    if (user_acc == false || user_pwd == false) {
        res.send({
            code: -1,
            msg: '缺少参数，检查提交的方式是否正确?'
        })
        return;
    }
    // 如果用户把手机号码和账号进行绑定了，用户就可以使用手机号码进行登录（本身使用邮箱登录）
    if (rep_phone.test(user_acc) || rep_email.test(user_acc)) {
        // 调用登录方法
        await userModel.login(user_acc, user_pwd)
            .then(
                data => {
                    res.send(data)
                }
            )
            .catch(
                err => {
                    res.send({
                        code: 500,
                        msg: '服务器异常...',
                        err
                    })
                }
            )
    } else {
        res.send({
            code: -1,
            msg: '账号格式不正确?'
        })
    }

})

// 接口6：修改用户头像（上传图片/预览头像）
router.post('/upload_img', upload.single('photo'), async (req, res) => {
    // 从请求头对象获取token信息
    let token = req.headers['token'];
    // 判断用户登录状态
    // 请求需要进行token校验 
    let jwt = new JwtUtil(token);
    // 返回一个对象（包含用户身份）
    let result = jwt.verifyToken();
    // res.send({
    //     msg: "测试",
    //     "user_id": result.data
    // })

    // 验通过执行下一步，否则就返回登陆信息不正确
    if (result == 'err') {
        // 提醒用户重新登录
        res.send({
            code: -1,
            msg: '登录已过期,请重新登录。'
        });
    } else {
        // 定义路径
        let picUrl = `${HOST_URL}/upload/${req.file.filename}`;
        // 返回上传头像文件路径
        res.send({
            code: 200,
            picUrl,
            msg: '用户头像上传预览成功。'
        })
    }
})

// 接口7：保存头像路径（图片路径储存在数据库）
router.post('/save_img', async (req, res) => {
    // 从请求头对象获取token信息
    let token = req.headers['token'];
    // 获取头像路径
    let user_avator = req.body.user_avator;
    // console.log('user_avator:',user_avator);
    // 判断用户登录状态
    // 请求需要进行token校验 
    let jwt = new JwtUtil(token);
    // 返回一个对象（包含用户身份）
    let result = jwt.verifyToken();
    // 验通过执行下一步，否则就返回登陆信息不正确
    if (result == 'err') {
        // 提醒用户重新登录
        res.send({
            code: -1,
            msg: '登录已过期,请重新登录。'
        });
    } else {
        // 调用保存图片路径到数据库的API
        let user_id = result.data;
        await userModel.modify_avator(user_id, user_avator)
            .then(
                content => {
                    res.send(content)
                }
            ).catch(
                err => {
                    res.send(err);
                }
            )
    }
})

// 接口8：删除头像（删除图片）
router.post('/delete_img', async (req, res) => {
    let {
        user_avator
    } = req.body;
    return new Promise((resolve, reject) => {
        //通过slice方法，分割出图片前面的url地址
        let index = user_avator.indexOf('upload')
        if (index > 0) {
            let temp_path = path.join(__dirname, '../../public', user_avator.slice(index));
            console.log('--->', temp_path);
            // fs.unlink删除文件
            fs.unlink(temp_path, function (error) {
                if (error) {
                    resolve({
                        code: -1,
                        msg: '删除图片失败。'
                    })
                } else {
                    //删除图片文件成功
                    resolve({
                        code: 200,
                        msg: '删除图片成功。'
                    })
                }
            })
        } else {
            res.send({
                code: -1,
                msg: '默认头像不用删除。'
            })
        }
    })
})

// 接口9：获取头像昵称
router.get('/get_avator_nickname', async (req, res) => {
    // 从请求头对象获取token信息
    let token = req.headers['token'] || req.query.token;
    // 判断用户登录状态
    // 请求需要进行token校验 
    let jwt = new JwtUtil(token);
    // 返回一个对象（包含用户身份）
    let result = jwt.verifyToken();
    // 验通过执行下一步，否则就返回登陆信息不正确
    if (result == 'err') {
        // 提醒用户重新登录
        res.send({
            code: -1,
            msg: '登录已过期,请重新登录。'
        });
    } else {
        // 调用保存图片路径到数据库的API
        let user_id = result.data;
        await userModel.get_avator_nickname(user_id).then(content => {
                res.send(content)
            })
            .catch(err => {
                res.send(err)
            })
    }

})

// 接口10：删除账号
router.post('/remove', async (req, res) => {
    //接收前端提交的参数
    let token = req.headers['token'];
    let {
        user_acc
    } = req.body;
    // 请求需要进行token校验
    let jwt = new JwtUtil(token);
    // 返回一个对象 (包含用户身份)
    let result = jwt.verifyToken();
    // 验证通过执行下一步，否则就返回登录信息不正确
    if (result == 'err') {
        res.send({
            code: -1,
            msg: '登录已过期，请重新登录'
        })
    } else {
        let user_id = result.data;
        await userModel.remove(user_id, user_acc).then(
                content => {
                    res.send(content)
                }
            )
            .catch(
                error => {
                    res.send(error)
                })
    }

})

// 接口11：查询账号
// 接口10：查看用户详情
router.post('/detail', async (req, res) => {
    let token = req.headers['token'];
    let {
        user_acc
    } = req.body;
    // 请求需要进行token校验 
    let jwt = new JwtUtil(token);
    // 返回一个对象（包含用户身份）
    let result = jwt.verifyToken();
    // 验通过执行下一步，否则就返回登陆信息不正确
    if (result == 'err') {
        // 提醒用户重新登录
        res.send({
            code: -1,
            msg: '登录已过期,请重新登录。'
        });
    } else {
        let user_id = result.data;
        await userModel.detail(user_id, user_acc).then(content => {
                res.send(content);
            })
            .catch(
                err => {
                    res.send(err);
                }
            )
    }
})

// 用户a 查询 用户a的详情
// 管理员查询 用户a的详情







//接口3
// router.get('/list2', async (req, res) => {
//     //接收前端提交的参数
//     await userModel.list2().then(
//         content => {
//             res.send(content)
//         }
//     ).catch(
//         error => {
//             res.send(error)
//         })
// })

// get：采用req.query['参数']
// post：采用req.body['参数']
//接口4 查询数据
// router.post('/detail', async (req, res) => {
//     //接收前端提交的参数
//     let user_id = req.body.user_id;
//     await userModel.detail(user_id).then(
//             content => {
//                 res.send(content)
//             }
//         )
//         .catch(
//             error => {
//                 res.send(error)
//             })
// })
//接口5 添加数据
// router.post('/add', async (req, res) => {
//     //接收前端提交的参数
//     let user_id = Math.random().toString().slice(2);
//     let user_acc = req.body.user_acc;
//     let user_pwd = req.body.user_pwd;
//     let user_nick_name = req.body.user_nick_name;
//     await userModel.add(user_id, user_acc, user_pwd, user_nick_name).then(
//             content => {
//                 res.send(content)
//             }
//         )
//         .catch(
//             error => {
//                 res.send(error)
//             })
// })
//接口5 修改数据
// router.post('/modify', async (req, res) => {
//     //接收前端提交的参数
//     let user_id = req.body.user_id;
//     let user_acc = req.body.user_acc;
//     let user_pwd = req.body.user_pwd;
//     let user_nick_name = req.body.user_nick_name;
//     await userModel.modify(user_id, user_acc, user_pwd, user_nick_name).then(
//             content => {
//                 res.send(content)
//             }
//         )
//         .catch(
//             error => {
//                 res.send(error)
//             })
// })
//接口5 删除数据
// router.post('/remove', async (req, res) => {
//     //接收前端提交的参数
//     let user_id = req.body.user_id;

//     await userModel.remove(user_id).then(
//             content => {
//                 res.send(content)
//             }
//         )
//         .catch(
//             error => {
//                 res.send(error)
//             })
// })
//4.把当前路由暴露在模块系统下
module.exports = router;